break;
case OPERATION_MODE_SEARCH:
- gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
+ &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &file_path,
-1);
break;
case OPERATION_MODE_RECENT:
- gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
+ &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_PATH, &file_path,
-1);
break;
break;
case OPERATION_MODE_SEARCH:
- gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->search_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), &child_iter,
SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
-1);
break;
case OPERATION_MODE_RECENT:
- gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->recent_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->recent_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->recent_model), &child_iter,
RECENT_MODEL_COL_IS_FOLDER, &is_folder,
-1);
break;
break;
case OPERATION_MODE_SEARCH:
- gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->search_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &closure->path,
-1);
break;
case OPERATION_MODE_RECENT:
- gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->recent_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (closure->impl->recent_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (closure->impl->recent_model), &child_iter,
RECENT_MODEL_COL_PATH, &closure->path,
-1);
break;
break;
case OPERATION_MODE_SEARCH:
- gtk_tree_model_get (GTK_TREE_MODEL (udata->impl->search_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (udata->impl->search_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (udata->impl->search_model), &child_iter,
SEARCH_MODEL_COL_DISPLAY_NAME, &display_name,
-1);
break;
case OPERATION_MODE_RECENT:
- gtk_tree_model_get (GTK_TREE_MODEL (udata->impl->recent_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (udata->impl->recent_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (udata->impl->recent_model), &child_iter,
RECENT_MODEL_COL_DISPLAY_NAME, &display_name,
-1);
break;
}
else if (closure.num_selected == 1)
{
+ GtkTreeIter child_iter;
+
if (impl->operation_mode == OPERATION_MODE_BROWSE)
{
- GtkTreeIter child_iter;
const GtkFileInfo *info;
gboolean change_entry;
}
else if (impl->operation_mode == OPERATION_MODE_SEARCH)
{
- gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model),
- &closure.first_selected_iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
+ &child_iter,
+ &closure.first_selected_iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_DISPLAY_NAME, &file_part,
-1);
}
else if (impl->operation_mode == OPERATION_MODE_RECENT)
{
- gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model),
- &closure.first_selected_iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
+ &child_iter,
+ &closure.first_selected_iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_DISPLAY_NAME, &file_part,
-1);
}
* but it'll make the search look like blocked.
*/
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
- GTK_TREE_MODEL (impl->search_model));
+ GTK_TREE_MODEL (impl->search_model_filter));
#endif
/* FMQ: if search was empty, say that we got no hits */
g_object_unref (impl->search_model);
impl->search_model = NULL;
+
+ g_object_unref (impl->search_model_filter);
+ impl->search_model_filter = NULL;
if (remove_from_treeview)
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), NULL);
gpointer user_data)
{
const char *collation_key_a, *collation_key_b;
+ gboolean is_folder_a, is_folder_b;
- gtk_tree_model_get (model, a, SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_a, -1);
- gtk_tree_model_get (model, b, SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_b, -1);
+ gtk_tree_model_get (model, a,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder_a,
+ SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_a,
+ -1);
+ gtk_tree_model_get (model, b,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder_b,
+ SEARCH_MODEL_COL_COLLATION_KEY, &collation_key_b,
+ -1);
+
+ /* always show folders first */
+ if (is_folder_a != is_folder_b)
+ return is_folder_a ? 1 : -1;
return strcmp (collation_key_a, collation_key_b);
}
gpointer user_data)
{
const struct stat *statbuf_a, *statbuf_b;
+ gboolean is_folder_a, is_folder_b;
/* Note that although we store a whole struct stat in the model, we only
* compare the mtime here. If we add another column relative to a struct stat
* one as well.
*/
- gtk_tree_model_get (model, a, SEARCH_MODEL_COL_STAT, &statbuf_a, -1);
- gtk_tree_model_get (model, b, SEARCH_MODEL_COL_STAT, &statbuf_b, -1);
+ gtk_tree_model_get (model, a,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder_a,
+ SEARCH_MODEL_COL_STAT, &statbuf_a,
+ -1);
+ gtk_tree_model_get (model, b,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder_b,
+ SEARCH_MODEL_COL_STAT, &statbuf_b,
+ -1);
+
+ if (is_folder_a != is_folder_b)
+ return is_folder_a ? 1 : -1;
if (statbuf_a->st_mtime < statbuf_b->st_mtime)
return -1;
return 0;
}
+static gboolean
+search_get_is_filtered (GtkFileChooserDefault *impl,
+ const GtkFilePath *path,
+ const gchar *display_name,
+ const gchar *mime_type)
+{
+ GtkFileFilterInfo filter_info;
+ GtkFileFilterFlags needed;
+ gboolean result;
+
+ if (!impl->current_filter)
+ return FALSE;
+
+ filter_info.contains = GTK_FILE_FILTER_DISPLAY_NAME | GTK_FILE_FILTER_MIME_TYPE;
+ needed = gtk_file_filter_get_needed (impl->current_filter);
+
+ filter_info.display_name = display_name;
+ filter_info.mime_type = mime_type;
+
+ if (needed & GTK_FILE_FILTER_FILENAME)
+ {
+ filter_info.filename = gtk_file_system_path_to_filename (impl->file_system, path);
+ if (filter_info.filename)
+ filter_info.contains |= GTK_FILE_FILTER_FILENAME;
+ }
+ else
+ filter_info.filename = NULL;
+
+ if (needed & GTK_FILE_FILTER_URI)
+ {
+ filter_info.uri = gtk_file_system_path_to_uri (impl->file_system, path);
+ if (filter_info.uri)
+ filter_info.contains |= GTK_FILE_FILTER_URI;
+ }
+ else
+ filter_info.uri = NULL;
+
+ result = gtk_file_filter_filter (impl->current_filter, &filter_info);
+
+ if (filter_info.filename)
+ g_free ((gchar *) filter_info.filename);
+ if (filter_info.uri)
+ g_free ((gchar *) filter_info.uri);
+
+ return !result;
+
+}
+
+/* Visibility function for the recent filter model */
+static gboolean
+search_model_visible_func (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ GtkFileChooserDefault *impl = user_data;
+ GtkFilePath *file_path;
+ gchar *display_name, *mime_type;
+ gboolean is_folder;
+
+ if (!impl->current_filter)
+ return TRUE;
+
+ gtk_tree_model_get (model, iter,
+ SEARCH_MODEL_COL_PATH, &file_path,
+ SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
+ SEARCH_MODEL_COL_DISPLAY_NAME, &display_name,
+ SEARCH_MODEL_COL_MIME_TYPE, &mime_type,
+ -1);
+
+ if (!display_name)
+ return TRUE;
+
+ if (is_folder)
+ return TRUE;
+
+ return !search_get_is_filtered (impl, file_path, display_name, mime_type);
+}
+
/* Creates the search_model and puts it in the tree view */
static void
search_setup_model (GtkFileChooserDefault *impl)
{
g_assert (impl->search_model == NULL);
+ g_assert (impl->search_model_filter == NULL);
/* We store these columns in the search model:
*
SEARCH_MODEL_COL_STAT,
GTK_SORT_DESCENDING);
+ impl->search_model_filter =
+ GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (impl->search_model), NULL));
+ gtk_tree_model_filter_set_visible_func (impl->search_model_filter,
+ search_model_visible_func,
+ impl, NULL);
+
/* EB: setting the model here will make the hits list update feel
* more "alive" than setting the model at the end of the search
* run
*/
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
- GTK_TREE_MODEL (impl->search_model));
+ GTK_TREE_MODEL (impl->search_model_filter));
}
/* Creates a new query with the specified text and launches it */
g_assert (impl->search_hbox == NULL);
g_assert (impl->search_entry == NULL);
g_assert (impl->search_model == NULL);
+ g_assert (impl->search_model_filter == NULL);
search_setup_widgets (impl);
file_list_set_sort_column_ids (impl);
g_object_unref (impl->recent_model);
impl->recent_model = NULL;
+ g_object_unref (impl->recent_model_filter);
+ impl->recent_model_filter = NULL;
+
if (remove_from_treeview)
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view), NULL);
}
gpointer user_data)
{
GtkRecentInfo *info_a, *info_b;
+ gboolean is_folder_a, is_folder_b;
+
+ gtk_tree_model_get (model, a,
+ RECENT_MODEL_COL_IS_FOLDER, &is_folder_a,
+ RECENT_MODEL_COL_INFO, &info_a,
+ -1);
+ gtk_tree_model_get (model, b,
+ RECENT_MODEL_COL_IS_FOLDER, &is_folder_b,
+ RECENT_MODEL_COL_INFO, &info_b,
+ -1);
- gtk_tree_model_get (model, a, RECENT_MODEL_COL_INFO, &info_a, -1);
- gtk_tree_model_get (model, b, RECENT_MODEL_COL_INFO, &info_b, -1);
+ /* folders always go first */
+ if (is_folder_a != is_folder_b)
+ return is_folder_a ? 1 : -1;
if (gtk_recent_info_get_modified (info_a) < gtk_recent_info_get_modified (info_b))
return -1;
return 0;
}
+static gboolean
+recent_get_is_filtered (GtkFileChooserDefault *impl,
+ const GtkFilePath *path,
+ GtkRecentInfo *recent_info)
+{
+ GtkFileFilterInfo filter_info;
+ GtkFileFilterFlags needed;
+ gboolean result;
+
+ if (!impl->current_filter)
+ return FALSE;
+
+ filter_info.contains = GTK_FILE_FILTER_DISPLAY_NAME | GTK_FILE_FILTER_MIME_TYPE;
+ needed = gtk_file_filter_get_needed (impl->current_filter);
+
+ filter_info.display_name = gtk_recent_info_get_display_name (recent_info);
+ filter_info.mime_type = gtk_recent_info_get_mime_type (recent_info);
+
+ if (needed & GTK_FILE_FILTER_FILENAME)
+ {
+ filter_info.filename = gtk_file_system_path_to_filename (impl->file_system, path);
+ if (filter_info.filename)
+ filter_info.contains |= GTK_FILE_FILTER_FILENAME;
+ }
+ else
+ filter_info.filename = NULL;
+
+ if (needed & GTK_FILE_FILTER_URI)
+ {
+ filter_info.uri = gtk_file_system_path_to_uri (impl->file_system, path);
+ if (filter_info.uri)
+ filter_info.contains |= GTK_FILE_FILTER_URI;
+ }
+ else
+ filter_info.uri = NULL;
+
+ result = gtk_file_filter_filter (impl->current_filter, &filter_info);
+
+ if (filter_info.filename)
+ g_free ((gchar *) filter_info.filename);
+ if (filter_info.uri)
+ g_free ((gchar *) filter_info.uri);
+
+ return !result;
+}
+
+/* Visibility function for the recent filter model */
+static gboolean
+recent_model_visible_func (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ GtkFileChooserDefault *impl = user_data;
+ GtkFilePath *file_path;
+ GtkRecentInfo *recent_info;
+ gboolean is_folder;
+
+ if (!impl->current_filter)
+ return TRUE;
+
+ gtk_tree_model_get (model, iter,
+ RECENT_MODEL_COL_INFO, &recent_info,
+ RECENT_MODEL_COL_PATH, &file_path,
+ RECENT_MODEL_COL_IS_FOLDER, &is_folder,
+ -1);
+
+ if (!recent_info)
+ return TRUE;
+
+ if (is_folder)
+ return TRUE;
+
+ return !recent_get_is_filtered (impl, file_path, recent_info);
+}
static void
recent_setup_model (GtkFileChooserDefault *impl)
{
g_assert (impl->recent_model == NULL);
+ g_assert (impl->recent_model_filter == NULL);
/* We store these columns in the search model:
*
recent_column_mtime_sort_func,
impl,
NULL);
-
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (impl->recent_model),
RECENT_MODEL_COL_INFO,
GTK_SORT_DESCENDING);
+
+ impl->recent_model_filter =
+ GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (GTK_TREE_MODEL (impl->recent_model), NULL));
+ gtk_tree_model_filter_set_visible_func (impl->recent_model_filter,
+ recent_model_visible_func,
+ impl,
+ NULL);
}
typedef struct
GtkFileChooserDefault *impl = load_data->impl;
gtk_tree_view_set_model (GTK_TREE_VIEW (impl->browse_files_tree_view),
- GTK_TREE_MODEL (impl->recent_model));
+ GTK_TREE_MODEL (impl->recent_model_filter));
set_busy_cursor (impl, FALSE);
if (impl->browse_files_model)
install_list_model_filter (impl);
+ if (impl->search_model_filter)
+ gtk_tree_model_filter_refilter (impl->search_model_filter);
+
+ if (impl->recent_model_filter)
+ gtk_tree_model_filter_refilter (impl->recent_model_filter);
+
g_object_notify (G_OBJECT (impl), "filter");
}
}
new_display_name = NULL;
if (cursor_path)
{
+ GtkTreeIter child_iter;
+
if (impl->operation_mode == OPERATION_MODE_BROWSE)
{
if (impl->sort_model)
{
GtkTreeIter iter;
- GtkTreeIter child_iter;
const GtkFileInfo *new_info;
gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->sort_model), &iter, cursor_path);
{
GtkTreeIter iter;
- gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model), &iter, cursor_path);
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_filter),
+ &iter, cursor_path);
gtk_tree_path_free (cursor_path);
- gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
+ &child_iter, &iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &new_path,
SEARCH_MODEL_COL_DISPLAY_NAME, &new_display_name,
-1);
{
GtkTreeIter iter;
- gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model), &iter, cursor_path);
+ gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model_filter),
+ &iter, cursor_path);
gtk_tree_path_free (cursor_path);
- gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
+ &child_iter, &iter);
+
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_PATH, &new_path,
RECENT_MODEL_COL_DISPLAY_NAME, &new_display_name,
-1);
GtkFileChooserDefault *impl)
{
GtkTreeIter iter;
+ GtkTreeIter child_iter;
switch (impl->operation_mode)
{
GtkFilePath *file_path;
gboolean is_folder;
- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model), &iter, path))
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->search_model_filter), &iter, path))
return;
- gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
+ &child_iter, &iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &file_path,
SEARCH_MODEL_COL_IS_FOLDER, &is_folder,
-1);
GtkFilePath *file_path;
gboolean is_folder;
- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model), &iter, path))
+ if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->recent_model_filter), &iter, path))
return;
+
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
+ &child_iter, &iter);
- gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &iter,
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_PATH, &file_path,
RECENT_MODEL_COL_IS_FOLDER, &is_folder,
-1);
case OPERATION_MODE_BROWSE:
{
- GtkTreeIter child_iter;
const GtkFileInfo *info;
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->sort_model), &iter, path))
switch (impl->operation_mode)
{
case OPERATION_MODE_SEARCH:
- gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), iter,
- SEARCH_MODEL_COL_PIXBUF, &pixbuf,
+ {
+ GtkTreeIter child_iter;
+
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter,
+ &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
+ SEARCH_MODEL_COL_PIXBUF, &pixbuf,
-1);
- sensitive = TRUE;
+ sensitive = TRUE;
+ }
break;
case OPERATION_MODE_RECENT:
{
+ GtkTreeIter child_iter;
GtkRecentInfo *info;
- gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter,
+ &child_iter, iter);
+
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_INFO, &info,
-1);
if (impl->operation_mode == OPERATION_MODE_SEARCH)
{
+ GtkTreeIter child_iter;
GtkFilePath *file_path;
gchar *display_name, *tmp;
gchar *text;
- gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_PATH, &file_path,
SEARCH_MODEL_COL_DISPLAY_NAME, &display_name,
-1);
if (impl->operation_mode == OPERATION_MODE_RECENT)
{
+ GtkTreeIter child_iter;
GtkRecentInfo *recent_info;
char *tmp, *text;
- gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter, &child_iter, iter);
+
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_INFO, &recent_info,
-1);
if (impl->operation_mode == OPERATION_MODE_SEARCH)
{
+ GtkTreeIter child_iter;
struct stat *statbuf;
- gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->search_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->search_model), &child_iter,
SEARCH_MODEL_COL_STAT, &statbuf,
-1);
time_mtime = statbuf->st_mtime;
}
else if (impl->operation_mode == OPERATION_MODE_RECENT)
{
+ GtkTreeIter child_iter;
GtkRecentInfo *info;
- gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), iter,
+ gtk_tree_model_filter_convert_iter_to_child_iter (impl->recent_model_filter, &child_iter, iter);
+ gtk_tree_model_get (GTK_TREE_MODEL (impl->recent_model), &child_iter,
RECENT_MODEL_COL_INFO, &info,
-1);
time_mtime = (GtkFileTime) gtk_recent_info_get_modified (info);